package com.atguigu.userprofile.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.userprofile.bean.TagCondition;
import com.atguigu.userprofile.bean.TaskInfo;
import com.atguigu.userprofile.bean.UserGroup;
import com.atguigu.userprofile.service.UserGroupService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 */
@RestController
public class UserGroupController {

    @Autowired
    UserGroupService userGroupService;

    @RequestMapping("/user-group-list")
    @CrossOrigin
    public String  getUserGroupList(@RequestParam("pageNo")int pageNo , @RequestParam("pageSize") int pageSize){
        int startNo=(  pageNo-1)* pageSize;
        int endNo=startNo+pageSize;

        QueryWrapper<UserGroup> queryWrapper = new QueryWrapper<>();
        int count = userGroupService.count(queryWrapper);

        queryWrapper.orderByDesc("id").last(" limit " + startNo + "," + endNo);
        List<UserGroup> userGroupList = userGroupService.list(queryWrapper);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("detail",userGroupList);
        jsonObject.put("total",count);

        return  jsonObject.toJSONString();
    }

//接收请求
//调用服务层
//返回结果
    @PostMapping("/user-group")
    public  String  saveUserGroup(@RequestBody  UserGroup userGroup){

       //保存基本信息到Mysql
       userGroupService.saveUserGroupInfo(userGroup);
        //计算人群包(该分群的用户群体) uid集合 由Clickhouse中bitmap做集合间运算
        userGroupService.genUserGroupUids(userGroup);
//      //把计算结果保存在可以处理高频访问的的数据容器中 比如redis
//        userGroupService.genUserGroupRedis(  userGroup);

        //throw  new RuntimeException("测试异常");
        return  "success";

    }


    //预估分群人数
//    @PostMapping("/user-group-evaluate")
    @CrossOrigin
    public Long userGroupEvaluate(@RequestBody UserGroup userGroup){
        Long userGroupCount = userGroupService.evaluateNum(userGroup);
        return userGroupCount;
    }

    //更新人群包
//    @PostMapping("/user-group-refresh/{userGroupId}")
    public String userGroupRefresh(@PathVariable("userGroupId") String userGroupId, @RequestParam("busiDate") String busiDate) {

        //删除原有的人群包（ck，redis）
        userGroupService.clearUserGroupUidCk(userGroupId);
        userGroupService.clearUserGroupUidRedis(userGroupId);


        //重新生成人群包
        UserGroup userGroup = userGroupService.getById(userGroupId);
        userGroup.setTagConditions(JSON.parseArray(userGroup.getConditionJsonStr(), TagCondition.class));
        userGroupService.genUserGroupUids(userGroup);

        //修改基本信息
        Long evaluateNum = userGroupService.evaluateNum(userGroup);
        userGroup.setUserGroupNum(evaluateNum);
        userGroup.setUpdateTime(new Date());
        userGroupService.saveOrUpdate(userGroup);


        //特别说明的问题：以上操作只是大致的实现方案，但是有bug，因为Clickhouse中删除和修改实际上是异步操作   那么就有可能还没删除完，有脏数据 拿到修改之前的数据  解决方法：提示！可以让redis中的数据不依赖于Clickhouse中已经保存的结果  这个时候了 实现方法就不再给大家了，独立完成

        return "seccess";
    }






}

